Share via


建立、加入、修改和刪除物件

物件內容中的物件是表示資料來源中資料之實體型別的執行個體 (Instance)。 您可以修改、建立及刪除物件內容中的物件,而 Entity Framework 會追蹤對這些物件所做的變更。 當呼叫 SaveChanges 方法時,Entity Framework 會產生及執行一些命令,這些命令會對資料來源執行同等的插入、更新或刪除陳述式 (Statement)。 如需詳細資訊,請參閱儲存變更及管理並行存取 (Entity Framework)。 

將插入、更新和刪除函式對應至預存程序

Entity Framework 可讓您將實體類型的插入、更新和刪除作業對應至預存程序。 如果您打算將預存程序對應至實體,建議您對應這三項作業。 例如,如果您將實體類型對應至插入和更新預存程序,但沒有對應至刪除預存程序卻試著刪除該類型的物件,則刪除作業在執行階段將會失敗而發生 UpdateException。 如需詳細資訊,請參閱 How to: Map Modification Functions to Stored ProceduresWalkthrough: Mapping an Entity to Stored Procedures

建立和加入物件

當您要在資料來源中插入資料時,必須建立實體類型的執行個體,並且將物件加入至物件內容。 在您可以將新物件儲存至資料來源之前,您必須先設定不支援 null 值的所有屬性。 使用 Entity Framework 產生之類別時,請考慮使用實體類型的靜態 CreateObjectName 方法來建立實體類型的新執行個體。 實體資料模型 工具在產生實體類型時會在每個類別中都包含這個方法。 這個建立方法是用來建立物件的執行個體,並設定不可為 null 之類別的所有屬性。 這個方法會針對 CSDL 檔案中已套用 Nullable="false" 屬性 (Attribute) 的每個屬性 (Property) 都包含參數。 如需詳細資訊,請參閱 HOW TO:使用靜態 Create 方法建立物件 (Entity Framework)

在處理 POCO (「單純」的 CLR 物件) 實體時,請使用 CreateObject 方法來建立新物件,而非使用 new 運算子。 CreateObject 方法會將新的 POCO 執行個體包裝在適當的 Proxy 物件中。 如需詳細資訊,請參閱使用 POCO 實體 (Entity Framework)

您可以使用下列其中一種方法來將新物件加入至物件內容:

下列考量適用於加入新物件的情況:

  • 在呼叫 SaveChanges 之前,Entity Framework 會為每個新物件產生暫存索引鍵值。 在呼叫 SaveChanges 之後,當插入新的資料列時,資料來源指派的識別值會取代該索引鍵值。

  • 如果資料庫未產生實體的索引鍵值,您應該指派唯一值。 如果兩個物件擁有之使用者指定的機碼值相同,則當呼叫 SaveChanges 時會發生 InvalidOperationException。 如果發生此情況,您應該指派唯一的值,並重試作業。

將物件加入至特定 EntitySet

可能會發生實體型別屬於多個實體集的狀況。 例如,假設有一個狀況是資料庫的兩個資料表具有相同的結構描述。 如果您想要分割資料來產生更有效率的備份程序,可能會發生這種情況。 例如,您可能具有在 CustomerCustomerArchive 資料表之間分割的客戶資料,其中 CustomerArchive 具有的結構描述與 Customer 相同,但是用於六個月以上未下訂單的客戶。Customer 可能每個晚上都會備份,而 CustomerArchive 則只會每週備份。 從對應的觀點來看,CustomerCustomerArchive 必須屬於不同的實體集。 Entity Framework 讓實體類型存在於一個或多個實體集之中,藉此支援這個案例。 如需詳細資訊,請參閱EntitySet 項目 (CSDL)

當實體類型存在於多個實體集內時,Entity Framework 可讓您將此類型的新執行個體加入至特定實體集。 從 .NET Framework 4 版開始,針對特定模型產生的 ObjectContext 類別會具有代表模型之實體集的 ObjectSet 型別的屬性。 使用 AddObject 方法來將新物件加入至物件內容。 如需詳細資訊,請參閱使用 ObjectSet (Entity Framework)。 在 .NET Framework 3.5 SP1 版中,當您呼叫 AddObject 方法來將物件加入至物件內容時,必須指定 entitySetName 的值。

修改物件

Entity Framework 會追蹤附加至 ObjectContext 之物件的變更。 實體資料模型 工具會產生一對部分方法,名稱為 OnPropertyChangingOnPropertyChanged。 這兩個方法會在屬性 setter 中被呼叫。 請在部分類別中擴充這些方法,以便在屬性變更期間插入自訂商務邏輯。 如需詳細資訊,請參閱 HOW TO:在純量屬性變更期間執行商務邏輯 (Entity Framework)。 如需使用 POCO 實體的指引,請參閱追蹤 POCO 實體中的變更 (Entity Framework)

下列考量適用於修改物件的情況:

  • 當複雜物件的任何純量或複雜屬性發生變更時,最上層實體物件的狀態會變更成 Modified。 在不符合 Proxy 產生之需求 (描述於建立 POCO Proxy 的需求 (Entity Framework)中) 的 POCO 實體中,在呼叫 DetectChanges 方法時,已修改之屬性的狀態會變更為 Modified

  • 當物件處於 Detached 狀態時,變更不會被追蹤。 物件在由使用 NoTracking 合併選項的查詢傳回的時候,或在藉由呼叫 DetachObjectContext 中斷連結之後,會處於這個狀態。

  • 當您變更外部索引鍵關聯時,相依物件的狀態會變更為 Modified。 當您變更獨立關聯時,相依物件的狀態並不會變更。

如需在 POCO 實體中追蹤變更的詳細資訊,請參閱追蹤 POCO 實體中的變更 (Entity Framework)

刪除物件

呼叫 ObjectSet 上的 DeleteObject,或呼叫 ObjectContext 上的 DeleteObject 方法會標示要刪除的指定物件。 直到呼叫 SaveChanges 之後,才會從資料來源中刪除資料列。

當刪除的實體物件與其他實體之間有關聯時,以下事項必須列入考量:

  • 當處理外部索引鍵關聯時,Entity Framework 會在刪除主體物件時,將相依物件之可為 Null 的外部索引鍵屬性設定為 null

  • 當主體實體的主索引鍵為相依實體之主索引鍵的一部分時,刪除主體物件也會刪除所有載入的相依物件。 這與針對關聯性定義串聯刪除規則相同。

關聯性的串聯刪除規則

當您想要在父記錄已刪除時自動刪除它的所有子記錄時,您可以指定串聯刪除規則。 強烈建議您同時在概念模型和資料庫中指定串聯刪除規則。 必須同時在資料庫和模型中指定串聯刪除規則是因為 Entity Framework 只會刪除記憶體中所載入的物件。 例如,如果您已經載入包含部分子系但不是所有子系的父系,則當您刪除該父系時,只會刪除記憶體中所載入的子系。 這表示,除非您在資料庫中指定了對應的串聯刪除規則,否則失去關聯的記錄可能會留在資料庫中,或者刪除作業可能會因為潛在的外部索引鍵條件約束違規而失敗。

當您處理獨立的關聯時,除非您執行下列其中一項動作,否則串聯刪除作業在一對一或是一對零或一的關聯性中可能會失敗:

  1. 在內容中載入一對一或是一對零或一關聯性的兩端。 如需詳細資訊,請參閱載入相關的物件 (Entity Framework)

  2. 如果在查詢物件時,關聯性的另一端具有一或是零或一的多重性,請將合併選項設定為 NoTracking,然後將物件附加至內容。 在此情況下,資料庫將會執行串聯刪除。

如需詳細資訊,請參閱串聯刪除及一對一 (或是一對零/一) 關聯性 (英文)。

定義串聯刪除規則

在 Entity Framework 中,串聯規則是由存放結構定義語言 (SSDL) 和概念結構定義語言 (CSDL) 中的 OnDelete 元素所定義。 如需詳細資訊,請參閱 OnDelete 項目 (CSDL)OnDelete 項目 (SSDL)

在 SQL Server 資料庫中,您可以使用 SQL Server Management Studio 設定串聯規則。 若要設定該規則,請在 [資料庫圖表] 視窗中顯示相關的資料表。 請選取關聯性,並按 F4 顯示 [屬性] 視窗。 在 [屬性] 視窗中,將 [INSERT 及 UPDATE 規格] 屬性底下的 [刪除規則] 設定為 [Cascade]。 當您從資料庫產生模型時,串聯規則就會匯入模型中。

Bb738695.Tip(zh-tw,VS.100).gif提示:
如果您使用串聯刪除規則來更新資料庫,然後從資料庫更新現有的模型,則 Entity Framework 會將串聯刪除規則加入至 SSDL 而不是 CSDL。 您必須手動將它加入。 若要在概念模型中指定串聯刪除規則,請在 Entity Designer 介面上選取關聯。 然後在 [屬性] 視窗中,選取 OnDelete 屬性的 Cascade

本章節內容

HOW TO:加入、修改和刪除物件 (Entity Framework)

HOW TO:使用靜態 Create 方法建立物件 (Entity Framework)

另請參閱

工作

HOW TO:使用每個類型的多重實體來定義模型 (Entity Framework)
HOW TO:加入、修改和刪除物件 (Entity Framework)

概念

定義及管理關聯性
使用 POCO 實體 (Entity Framework)
使用 ObjectSet (Entity Framework)
使用 ObjectSet (Entity Framework)
OnDelete 項目 (CSDL)